package com.example.service;


import com.example.dao.NxSystemFileInfoDao;
import com.example.entity.NxSystemFileInfo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * 系统文件信息服务层
 * <p>
 * 处理系统级文件元数据的核心业务逻辑，包含文件信息的增删改查、分页查询及特殊查询功能
 * </p>
 * <p>
 * 注：当前实现包含硬编码参数"all"，需与DAO层特殊处理逻辑配合使用
 * </p>
 */
@Service
public class NxSystemFileInfoService {

    @Value("${authority.info}")
    private String authorityInfo;


    @Resource
    private NxSystemFileInfoDao nxSystemFileInfoDao;

    /**
     * 添加系统文件信息
     *
     * @param nxSystemFileInfo 文件信息实体对象（至少需要包含name/file等关键字段）
     * @return 插入后的完整文件信息对象（包含数据库生成的ID等字段）
     */
    public NxSystemFileInfo add(NxSystemFileInfo nxSystemFileInfo) {
        nxSystemFileInfoDao.insertSelective(nxSystemFileInfo);
        return nxSystemFileInfo;
    }

    /**
     * 物理删除文件信息
     *
     * @param id 要删除的文件记录主键ID
     * @throws org.springframework.dao.EmptyResultDataAccessException 当ID不存在时抛出空结果异常
     */
    public void delete(Long id) {
        nxSystemFileInfoDao.deleteByPrimaryKey(id);
    }

    /**
     * 更新文件信息（仅更新非空字段）
     *
     * @param nxSystemFileInfo 包含更新字段的文件信息实体（必须包含有效ID）
     * @throws IllegalArgumentException 当传入对象ID为空时抛出参数异常
     */
    public void update(NxSystemFileInfo nxSystemFileInfo) {
        nxSystemFileInfoDao.updateByPrimaryKeySelective(nxSystemFileInfo);
    }

    /**
     * 根据主键ID查询文件详情
     *
     * @param id 文件记录主键ID
     * @return 对应的文件信息实体（找不到时返回null）
     */
    public NxSystemFileInfo findById(Long id) {
        return nxSystemFileInfoDao.selectByPrimaryKey(id);
    }

    /**
     * 根据文件名精确查询文件信息
     *
     * @param name 文件名称（精确匹配）
     * @return 匹配的文件信息实体（找不到时返回null）
     */
    public NxSystemFileInfo findByFileName(String name) {
        return nxSystemFileInfoDao.findByFileName(name);
    }

    /**
     * 查询所有文件信息（特殊实现）
     *
     * @return 文件信息列表（通过传入硬编码参数"all"触发DAO层全量查询）
     */
    public List<NxSystemFileInfo> findAll() {
        return nxSystemFileInfoDao.findByName("all");
    }

    /**
     * 分页条件查询文件信息
     *
     * @param name     文件名关键词（支持模糊查询，传null表示不限制）
     * @param pageNum  当前页码（从1开始计数）
     * @param pageSize 每页显示记录数（建议值：10-100）
     * @return {@link PageInfo<NxSystemFileInfo>} 分页结果包装对象（包含总记录数、当前页数据、分页导航参数等）
     * @throws IllegalArgumentException 当pageNum<1或pageSize<1时抛出参数异常
     */
    public PageInfo<NxSystemFileInfo> findPage(String name, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<NxSystemFileInfo> all = nxSystemFileInfoDao.findByName(name);
        return PageInfo.of(all);
    }


    public NxSystemFileInfo getByFileHash(String fileHash) {
        return nxSystemFileInfoDao.selectByHash(fileHash);
    }

}
